import sympy as sym
from sympy import Max, Matrix, oo
import numpy as np
# todo:
# 别的形式 
# M = max(A,[],dim,nanflag)
# M = max(A,[],'all')
# M = max(A,[],'all',nanflag)
# C = max(A,B)
# C = max(A,B,nanflag)

def my_max(A):
    """返回符号输入 A 的最大值"""
    
    # 判断 A 是否为向量或矩阵
    if isinstance(A, list) or isinstance(A, tuple):
        # A 是向量
        return Max(*A)
    else:
        # A 是矩阵，返回每列的最大值
        return np.max(A, axis=0)
    
import sympy
import math

def max_with_nanflag(A, nanflag='omitnan'):
    # 初始化最大值为负无穷大

    max_val = float('-inf')

    # 遍历数组中的每个元素
    for val in A:
        # 如果值是 NaN，则根据需要忽略它
        if isinstance(val, sympy.Basic) and val is sympy.nan:
            if nanflag == 'includenan':
                return sympy.nan
        # 否则计算它的值，并将其与当前最大值进行比较
        else:
            max_val = Max(max_val, val)

    return max_val



def max_with_dim(A, dim):
    """
    找出矩阵 A 中每一行或每一列的最大值

    参数：
        A (numpy.ndarray): 一个二维矩阵，包含需要计算最大值的数值
        dim (int): 需要计算最大值的维度，可以为 1（计算每一列的最大值）或 2（计算每一行的最大值）

    返回值：
        M (numpy.ndarray): 一个二维矩阵，包含每一行或每一列的最大值
    """
    # 使用 np.max() 函数计算最大值
    if dim == 1:
        # 计算每一列的最大值
        M = np.max(A, axis=0)
    elif dim == 2:
        # 计算每一行的最大值
        M = np.max(A, axis=1)

    return M

# def max_with_dim_nanflag(A,dim,nanflag='omitnan'):
#         # 使用 np.max() 函数计算最大值
#     if dim == 1:
#         # 计算每一列的最大值
#         if(nanflag == 'omitnan'):
#             M = np.nanmax(A, axis=0)
#         elif nanflag == 'includenan':
#             M = np.max(A,axis=0)
#     elif dim == 2:
#         if(nanflag == 'omitnan'):
#             M = np.nanmax(A,axis=1)
#         elif(nanflag == 'includenan'):
#             M = np.max(A,axis=1)


    
x = sym.symbols('x')
A = [1,2,30,4]
B = [1,4,x,sym.nan]
C = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# print(max(A))
print(my_max(C))



# print(max_with_nanflag(B))
# print(max_with_nanflag(B,'includenan'))

# print(max_with_dim_nanflag(C,1,'includenan'))
print(max_with_dim(A,1))